#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "securec.h"

/* 任务ID */
osThreadId_t g_testTaskId;
/* 事件标志组 */
osEventFlagsId_t g_exampleEvent;
/* 事件标志位定义 */
#define EVENT_WAIT (1UL << 0)  // CMSIS要求使用UL类型

// 修改任务函数签名（添加void*参数）
void Example_Event(void *argument) {
    (void)argument;  // 明确标记未使用参数
    uint32_t event;
    
    printf("Example_Event wait event 0x%lx\n", EVENT_WAIT);
    // 使用事件标志等待API（AND模式，100 ticks超时）
    event = osEventFlagsWait(g_exampleEvent, EVENT_WAIT, 
                           osFlagsWaitAll, 100); 
    
    if (event & EVENT_WAIT) {  // CMSIS返回实际获取的标志位
        printf("Example_Event,read event :0x%lx\n", event);
    } else {
        if (event == osFlagsErrorTimeout) {  // 处理超时情况
            printf("Example_Event,read event timeout\n");
        } else {
            printf("Event error:0x%lx\n", event);
        }
    }
    osThreadSuspend(g_testTaskId);  // 挂起当前任务
}

// 修改返回类型为void以匹配CMSIS要求
void Example_TaskEntry(void) {
    osStatus_t ret;
    
    /* 创建事件标志组 */
    g_exampleEvent = osEventFlagsNew(NULL);
    if (g_exampleEvent == NULL) {
        printf("init event failed!\n");
        return;
    }

    /* 创建任务属性配置 */
    osThreadAttr_t task_attr = {
        .name = "EventTsk1",
        .stack_size = 1024,  // 根据实际需求调整
        .priority = osPriorityNormal,  // 使用CMSIS标准优先级
    };

    /* 创建任务 */
    g_testTaskId = osThreadNew(Example_Event, NULL, &task_attr);
    if (g_testTaskId == NULL) {
        printf("task create failed!\n");
        osEventFlagsDelete(g_exampleEvent);
        return;
    }

    /* 发送事件标志 */
    printf("ready to write...\n");
    ret = osEventFlagsSet(g_exampleEvent, EVENT_WAIT);
    if (ret < 0) {  // CMSIS返回设置后的标志位值或错误码
        printf("event write failed:0x%x\n", ret);
        osEventFlagsDelete(g_exampleEvent);
        osThreadTerminate(g_testTaskId);
        return;
    }

    /* 清除事件标志 */
    printf("EventMask:%lu\n", osEventFlagsGet(g_exampleEvent));
    osEventFlagsClear(g_exampleEvent, ~EVENT_WAIT);  // 清除非目标标志位
    printf("EventMask:%lu\n", osEventFlagsGet(g_exampleEvent));

    osDelay(50);

    /* 删除任务 */
    osThreadTerminate(g_testTaskId);
    osEventFlagsDelete(g_exampleEvent);
    printf("task delete success\n");
}

APP_FEATURE_INIT(Example_TaskEntry);